package modelo;

import clases.AlmacenArticulo;
import clases.Kardex;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.ArrayList;

/**
 *
 * @author Edder
 * @version 1.0
 */
public class MdlKardex implements Modelo<Kardex>{

    /**
     * Inserta Kardex (sin ID)
     * @param objeto
     * @param cnx
     * @throws SQLException
     */
    @Override
    public void insert(Kardex objeto, Conexion cnx) throws SQLException {
        String sql = "INSERT INTO kardex( idAlmacenArticulo, movimiento, cantidad, fecha) VALUES("
                + objeto.getAlmacenArticulo().getIdAlmacenArticulo() + ", '"
                + objeto.getMovimiento() + "', "
                + objeto.getCantidad() + ", '"
                + objeto.getFecha().toString() + "');";
        System.out.println(sql);
        cnx.ejecutar(sql);
    }

    /**
     * Devuelve el máximo ID insertado
     * @param cnx Conexión previamente abierta
     * @return Último ID
     * @throws SQLException
     */
    @Override
    public int getLastId(Conexion cnx) throws SQLException {
        String sql = "SELECT MAX(idKardex) FROM kardex";
        ResultSet rs = cnx.consultar(sql);
        if(rs.next())
            return rs.getInt(1);
        return -1;
    }

    /**
     * Actualiza kardex
     * @param objeto Kardex
     * @param cnx Conexión previamente abierta
     * @throws SQLException
     */
    @Override
    public void update(Kardex objeto, Conexion cnx) throws SQLException {
        String sql = "UPDATE kardex SET "
                + "movimiento = '" + objeto.getMovimiento() + "', "
                + "cantidad = " + objeto.getCantidad() + ", "
                + "fecha = '" + objeto.getFecha().toString() + "' WHERE "
                + "idKadex = " + objeto.getIdKardex() + ";";
        cnx.ejecutar(sql);
    }
    
    public ArrayList<Kardex> getKardex_fechas(String fechaInicio, String fechaFin,
            int idAlmacen, int idArticulo, Conexion cnx) throws SQLException{
        String sql = "SELECT k.idKardex, k.idAlmacenArticulo, k.movimiento, "
                + "k.cantidad, k.fecha "
                + "FROM kardex AS k "
                + "INNER JOIN almacenarticulo as aa "
                + "ON aa.idAlmacenArticulo = k.idAlmacenArticulo "
                + "WHERE aa.idAlmacen = " + idAlmacen + " AND "
                + "aa.idArticulo = " + idArticulo + " AND "
                + "k.fecha >= '" + fechaInicio + "' AND "
                + "k.fecha <= '" + fechaFin + "';"; 
        return get(sql, cnx);
    }

    /**
     * No implementado, retorna null
     * @param sql
     * @param cnx
     * @return
     * @throws SQLException
     */
    @Override
    public ArrayList<Kardex> get(String sql, Conexion cnx) throws SQLException {
        ArrayList<Kardex> kardexs = new ArrayList<>();
        ResultSet rs = cnx.consultar(sql);
        while(rs.next()){
            kardexs.add(new Kardex(
                    rs.getInt("idKardex"), 
                    new AlmacenArticulo(){
                        {
                            this.setIdAlmacenArticulo(rs.getInt("idArticulo"));
                        }
                    }, 
                    rs.getString("movimiento").charAt(0), 
                    rs.getInt("cantidad"), 
                    LocalDate.parse("fecha")));
        }
        return kardexs;
    }

    /**
     * Devuelve Kardex según ID
     * @param id Id de kardex a consultar
     * @param cnx Conexión previamente abierta
     * @return Kardex
     * @throws SQLException
     */
    @Override
    public Kardex get(int id, Conexion cnx) throws SQLException {
        String sql = "SELECT * FROM kardex WHERE idKardex = " + id;
        ResultSet rs = cnx.consultar(sql);
        if(rs.next())
            return new Kardex(
                    rs.getInt("idKardex"),
                    new AlmacenArticulo(){{this.setIdAlmacenArticulo(rs.getInt("idAlmacenArticulo"));}},
                    rs.getString("movimiento").charAt(0),
                    rs.getInt("cantidad"),
                    LocalDate.parse(rs.getString("fecha")));
        return null;
    }
    
}
